﻿2026-05-10T14:48:11.7215891Z ##[group]Run pnpm verify:phase-4
2026-05-10T14:48:11.7216214Z [36;1mpnpm verify:phase-4[0m
2026-05-10T14:48:11.7237456Z shell: /usr/bin/bash -e {0}
2026-05-10T14:48:11.7237711Z env:
2026-05-10T14:48:11.7237956Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-10T14:48:11.7238762Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-10T14:48:11.7239002Z   SKIP_TRACE_CHECK: 1
2026-05-10T14:48:11.7239224Z ##[endgroup]
2026-05-10T14:48:12.0380641Z 
2026-05-10T14:48:12.0381743Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-10T14:48:12.0382721Z > node scripts/verify-phase-4.mjs
2026-05-10T14:48:12.0383206Z 
2026-05-10T14:48:12.0725265Z 
2026-05-10T14:48:12.0725789Z === Workspace: typecheck ===
2026-05-10T14:48:12.0726455Z >>> pnpm -r typecheck
2026-05-10T14:48:12.4151477Z Scope: 5 of 6 workspace projects
2026-05-10T14:48:12.4203951Z packages/db typecheck$ tsc --noEmit
2026-05-10T14:48:12.4212323Z packages/game-logic typecheck$ tsc --noEmit
2026-05-10T14:48:15.1769456Z packages/game-logic typecheck: Done
2026-05-10T14:48:15.1789121Z packages/protocol typecheck$ tsc --noEmit
2026-05-10T14:48:17.2199092Z packages/db typecheck: Done
2026-05-10T14:48:18.6622819Z packages/protocol typecheck: Done
2026-05-10T14:48:18.6647756Z apps/client typecheck$ tsc --noEmit
2026-05-10T14:48:18.6654306Z apps/server typecheck$ tsc --noEmit
2026-05-10T14:48:29.2493244Z apps/client typecheck: Done
2026-05-10T14:48:30.8557357Z apps/server typecheck: Done
2026-05-10T14:48:30.8659357Z 
2026-05-10T14:48:30.8659960Z === Lint: protocol-sync ===
2026-05-10T14:48:30.8660774Z >>> pnpm lint:protocol-sync
2026-05-10T14:48:31.1697122Z 
2026-05-10T14:48:31.1698188Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-10T14:48:31.1699797Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-10T14:48:31.1700502Z 
2026-05-10T14:48:31.2009430Z lint-protocol-sync: OK
2026-05-10T14:48:31.2123490Z 
2026-05-10T14:48:31.2124207Z === Lint: game-logic-purity ===
2026-05-10T14:48:31.2125086Z >>> pnpm lint:game-logic-purity
2026-05-10T14:48:31.5157414Z 
2026-05-10T14:48:31.5158705Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-10T14:48:31.5161578Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-10T14:48:31.5162016Z 
2026-05-10T14:48:31.5477869Z lint-game-logic-purity: OK (6 file(s) clean)
2026-05-10T14:48:31.5589268Z 
2026-05-10T14:48:31.5589940Z === Lint: better-auth-schema-sync ===
2026-05-10T14:48:31.5591343Z >>> pnpm lint:better-auth-schema-sync
2026-05-10T14:48:31.8651345Z 
2026-05-10T14:48:31.8652370Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-10T14:48:31.8655316Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-10T14:48:31.8655792Z 
2026-05-10T14:48:33.5269478Z lint-better-auth-schema-sync: OK
2026-05-10T14:48:33.5385557Z 
2026-05-10T14:48:33.5386173Z === Lint: rate-limit-budgets ===
2026-05-10T14:48:33.5387557Z >>> pnpm lint:rate-limit-budgets
2026-05-10T14:48:33.8424327Z 
2026-05-10T14:48:33.8428744Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-10T14:48:33.8459703Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-10T14:48:33.8460422Z 
2026-05-10T14:48:33.8742328Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-10T14:48:33.8857888Z 
2026-05-10T14:48:33.8859448Z === Lint: no-clipboard-rce ===
2026-05-10T14:48:33.8879149Z >>> pnpm lint:no-clipboard-rce
2026-05-10T14:48:34.1904365Z 
2026-05-10T14:48:34.1908923Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-10T14:48:34.1910086Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-10T14:48:34.1910717Z 
2026-05-10T14:48:34.2245538Z lint-no-clipboard-rce: OK (21 file(s) clean)
2026-05-10T14:48:34.2360766Z 
2026-05-10T14:48:34.2361368Z === Lint: room-layout ===
2026-05-10T14:48:34.2362326Z >>> pnpm lint:room-layout
2026-05-10T14:48:34.5422417Z 
2026-05-10T14:48:34.5423482Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-10T14:48:34.5424934Z > node tools/scripts/lint-room-layout.mjs
2026-05-10T14:48:34.5426173Z 
2026-05-10T14:48:34.5788177Z lint-room-layout: OK
2026-05-10T14:48:34.5905071Z 
2026-05-10T14:48:34.5905567Z === ADR 0004 lint ===
2026-05-10T14:48:34.5906303Z >>> pnpm lint:adr:0004
2026-05-10T14:48:34.8951204Z 
2026-05-10T14:48:34.8952202Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-10T14:48:34.8954189Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-10T14:48:34.8955188Z 
2026-05-10T14:48:34.9253223Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-10T14:48:34.9363771Z 
2026-05-10T14:48:34.9364304Z === Drizzle: emit-check ===
2026-05-10T14:48:34.9365078Z >>> pnpm db:emit-check
2026-05-10T14:48:35.2408212Z 
2026-05-10T14:48:35.2409507Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-10T14:48:35.2412759Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-10T14:48:35.2414995Z 
2026-05-10T14:48:35.6842129Z No config path provided, using default 'drizzle.config.ts'
2026-05-10T14:48:35.6844601Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-10T14:48:36.1049762Z 8 tables
2026-05-10T14:48:36.1050647Z accounts 8 columns 1 indexes 0 fks
2026-05-10T14:48:36.1051741Z audit_log 6 columns 0 indexes 2 fks
2026-05-10T14:48:36.1052647Z characters 9 columns 0 indexes 1 fks
2026-05-10T14:48:36.1055809Z inventory_items 4 columns 0 indexes 1 fks
2026-05-10T14:48:36.1056823Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-10T14:48:36.1057852Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-10T14:48:36.1059110Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-10T14:48:36.1059896Z sessions 5 columns 0 indexes 1 fks
2026-05-10T14:48:36.1060480Z 
2026-05-10T14:48:36.1090069Z No schema changes, nothing to migrate 😴
2026-05-10T14:48:36.6930901Z 
2026-05-10T14:48:36.6931634Z === Drizzle: schema-sync ===
2026-05-10T14:48:36.6932428Z >>> pnpm lint:schema-sync
2026-05-10T14:48:37.0132851Z 
2026-05-10T14:48:37.0133458Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-10T14:48:37.0135280Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-10T14:48:37.0136506Z 
2026-05-10T14:48:37.0398811Z OK
2026-05-10T14:48:37.0530820Z 
2026-05-10T14:48:37.0531238Z === Drizzle: source-comments ===
2026-05-10T14:48:37.0531824Z >>> pnpm lint:source-comments
2026-05-10T14:48:37.3595467Z 
2026-05-10T14:48:37.3596514Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-10T14:48:37.3597785Z > pnpm -C packages/db run lint:source-comments
2026-05-10T14:48:37.3598801Z 
2026-05-10T14:48:37.6716547Z 
2026-05-10T14:48:37.6717811Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-10T14:48:37.6719699Z > node scripts/check-source-comments.mjs
2026-05-10T14:48:37.6720417Z 
2026-05-10T14:48:37.7042094Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-10T14:48:37.7259182Z 
2026-05-10T14:48:37.7259895Z === Workspace: test ===
2026-05-10T14:48:37.7260771Z >>> pnpm -r test
2026-05-10T14:48:38.0353900Z Scope: 5 of 6 workspace projects
2026-05-10T14:48:38.0408456Z packages/db test$ vitest run
2026-05-10T14:48:38.0417869Z packages/game-logic test$ vitest run
2026-05-10T14:48:38.5581040Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-10T14:48:38.5610206Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-10T14:48:38.9170891Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-10T14:48:39.1620065Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-10T14:48:39.4019607Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T14:48:39.5822754Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T14:48:39.6459374Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T14:48:39.6579923Z packages/game-logic test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T14:48:39.6607266Z packages/game-logic test: [2m      Tests [22m [1m[32m21 passed[39m[22m[90m (21)[39m
2026-05-10T14:48:39.6619872Z packages/game-logic test: [2m   Start at [22m 14:48:38
2026-05-10T14:48:39.6621825Z packages/game-logic test: [2m   Duration [22m 1.08s[2m (transform 127ms, setup 0ms, import 218ms, tests 48ms, environment 1ms)[22m
2026-05-10T14:48:39.6969294Z packages/game-logic test: Done
2026-05-10T14:48:39.6979793Z packages/protocol test$ vitest run
2026-05-10T14:48:39.8244427Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T14:48:40.2220505Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-10T14:48:40.6326158Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-10T14:48:40.6785520Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-10T14:48:40.6839491Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-10T14:48:40.6859634Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-10T14:48:40.6889996Z packages/db test: [2m   Start at [22m 14:48:38
2026-05-10T14:48:40.6910418Z packages/db test: [2m   Duration [22m 2.12s[2m (transform 161ms, setup 0ms, import 1.46s, tests 29ms, environment 1ms)[22m
2026-05-10T14:48:40.7193088Z packages/db test: Done
2026-05-10T14:48:40.8345276Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T14:48:40.9997958Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T14:48:41.1523198Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T14:48:41.1566019Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T14:48:41.1593832Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-10T14:48:41.1659207Z packages/protocol test: [2m   Start at [22m 14:48:40
2026-05-10T14:48:41.1661045Z packages/protocol test: [2m   Duration [22m 924ms[2m (transform 136ms, setup 0ms, import 251ms, tests 39ms, environment 1ms)[22m
2026-05-10T14:48:41.1919996Z packages/protocol test: Done
2026-05-10T14:48:41.1929583Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-10T14:48:41.1930805Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-10T14:48:41.7495176Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-10T14:48:41.8054698Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-10T14:48:42.9681464Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 76[2mms[22m[39m
2026-05-10T14:48:43.2857376Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T14:48:43.3881060Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-10T14:48:43.3884337Z apps/client test: [22m[39mroom_layout signature did not verify — rendering skipped for mvp-lobby 000
2026-05-10T14:48:43.4032781Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 178[2mms[22m[39m
2026-05-10T14:48:43.5745327Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 27[2mms[22m[39m
2026-05-10T14:48:43.8900203Z apps/server test: {"level":40,"time":1778424523885,"pid":3257,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T14:48:43.8972243Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T14:48:43.8974578Z apps/server test: {"level":40,"time":1778424523888,"pid":3257,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T14:48:43.8976873Z apps/server test: {"level":40,"time":1778424523889,"pid":3257,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T14:48:44.5993561Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-10T14:48:44.8551318Z apps/server test: {"level":30,"time":1778424524833,"pid":3272,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-10T14:48:44.8893577Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 721[2mms[22m[39m
2026-05-10T14:48:44.8910553Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 572[2mms[22m[39m
2026-05-10T14:48:45.8560913Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-10T14:48:45.8961062Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-10T14:48:45.8963384Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-NhHoF6/rebno.db
2026-05-10T14:48:45.8969812Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T14:48:45.8971778Z apps/server test: [run-migrations] OK
2026-05-10T14:48:45.9080790Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-10T14:48:45.9090461Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-Ul4Bk9/rebno.db
2026-05-10T14:48:45.9093261Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T14:48:45.9097656Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-10T14:48:45.9101743Z apps/server test: [run-migrations] OK
2026-05-10T14:48:45.9206152Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T14:48:45.9209977Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-HxtWSX/rebno.db
2026-05-10T14:48:45.9213646Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T14:48:45.9239596Z apps/server test: [run-migrations] OK
2026-05-10T14:48:45.9242242Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T14:48:45.9244236Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-HxtWSX/rebno.db
2026-05-10T14:48:45.9245988Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T14:48:45.9247065Z apps/server test: [run-migrations] OK
2026-05-10T14:48:45.9320376Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 54[2mms[22m[39m
2026-05-10T14:48:46.2423379Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-10T14:48:46.5091267Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T14:48:46.7619796Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-10T14:48:47.0023970Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T14:48:47.0773274Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 120[2mms[22m[39m
2026-05-10T14:48:47.8366903Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-10T14:48:47.8369231Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌁ auth for agents [www.vestauth.com]
2026-05-10T14:48:47.8374743Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-10T14:48:48.4420827Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 128[2mms[22m[39m
2026-05-10T14:48:48.5356188Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T14:48:48.5435835Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-10T14:48:48.5474346Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-10T14:48:48.5519230Z apps/server test: [2m   Start at [22m 14:48:41
2026-05-10T14:48:48.5523107Z apps/server test: [2m   Duration [22m 6.78s[2m (transform 450ms, setup 0ms, import 3.39s, tests 959ms, environment 2ms)[22m
2026-05-10T14:48:48.5859540Z apps/server test: Done
2026-05-10T14:48:49.1800487Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-10T14:48:49.9322085Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 76[2mms[22m[39m
2026-05-10T14:48:50.6130224Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T14:48:51.2974218Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T14:48:51.9682240Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T14:48:52.6460361Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 25[2mms[22m[39m
2026-05-10T14:48:53.3188960Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T14:48:53.9957739Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T14:48:54.6753577Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T14:48:55.3519849Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T14:48:56.0110344Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T14:48:56.0320118Z apps/client test: [2m Test Files [22m [1m[32m16 passed[39m[22m[90m (16)[39m
2026-05-10T14:48:56.0326557Z apps/client test: [2m      Tests [22m [1m[32m98 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (102)[39m
2026-05-10T14:48:56.0328524Z apps/client test: [2m   Start at [22m 14:48:41
2026-05-10T14:48:56.0330566Z apps/client test: [2m   Duration [22m 14.22s[2m (transform 557ms, setup 44ms, collect 912ms, tests 621ms, environment 8.24s, prepare 1.66s)[22m
2026-05-10T14:48:56.1662210Z apps/client test: Done
2026-05-10T14:48:56.1759119Z 
2026-05-10T14:48:56.1759873Z verify-phase-4: OK (12 steps green)
